var
關鍵字,聲明一個 function scope
變數let
關鍵字,聲明一個 block scope
變數const
關鍵字,聲明一個 block scope
常數console.log('用var關鍵字 定義變數')
var i='全域變數';
console.log(`i=${i}`);
//`i=${i}` 等價於 'i='+i 字串連接
// ` 反引號在~鍵上面 (我一開始還找不到,所以特別寫這行)
console.log("I'm in the function")
function fun(){
var i='function內變數';
console.log(`i=${i}`)
};
fun();
console.log("I'm out of the function")
console.log(`i=${i}`);
console.log("I'm in the for loop")
for(var i=0;i<5;i++){
console.log(`i=${i}`)
} //i=5離開for迴圈
console.log("I'm out of the for loop")
console.log(`i=${i}`);
甚麼是 function scope
,講人話就是:
var
關鍵字令出的變數,他的有效範圍以function
界定。
function
外,聽 全域window
的function
內,聽function
的,function
內找不到變數,才往全域window
找好的,那我們現在來對一下剛剛上面的答案。
用var關鍵字 定義變數
i=全域變數
I'm in the function
i=function內變數
I'm out of the function
i=全域變數
I'm in the for loop
i=0
i=1
i=2
i=3
i=4
I'm out of the for loop
i=5
離開for loop
後,我們再次呼叫變數i
,得到的答案是:5。
原因是for loop
不是function
,會影響到在全域
用var
定義的變數i
。
為了解決這個問題,我們有了let
和const
,他們的變數有效範圍以 {}
界定。來看看他的效果~
console.log('用let關鍵字 定義變數')
let k='全域變數';
console.log(`k=${k}`);
console.log("I'm in the function")
function fun(){
let k='function內變數';
console.log(`k=${k}`)
};
fun();
console.log("I'm out of the function")
console.log(`k=${k}`);
console.log("I'm in the for loop")
for(let k=0;k<5;k++){
console.log(`k=${k}`)
}
console.log("I'm out of the for loop")
console.log(`k=${k}`)
用let關鍵字 定義變數
k=全域變數
I'm in the function
k=function內變數
I'm out of the function
k=全域變數
I'm in the for loop
k=0
k=1
k=2
k=3
k=4
I'm out of the for loop
k=全域變數
這次我們離開for loop
後,我們再次呼叫變數i
,得到的答案是:全域變數。
因為變數i
是用let
定義的,他的變數有效範圍靠{}
界定,而for loop
就有{}
。
let、const不能重複宣告,會報錯
var a=1
var a="haosjdoija";
let a=1
let a="haosjdoija";
//Uncaught SyntaxError: Identifier 'a' has already been declared